Если Вы еще не сталкивались с виджетом Yii CGridView, то рекомендуем почитать о нем здесь: Yii Framework, отображение списка (таблицы) записей с помощью виджета CGridView

Для удобства выбора диапазона дат будем использовать виджет DatePicker. И так приступим к реализации примера.

Модель (model)

В модели необходимо внести некоторые правки. А именно, объявить два свойства $fromDate и $toDate которые будут принимать значение для поиска:

<?php
class Posts extends CActiveRecord {
/** * Поиск по диапозону дат, начальная дата * * @var string */ public $fromDate;
/** * Поиск по диапозону дат, конечная дата * * @var string */ public $toDate;
//... }

Эти два свойства необходимо добавить в массив search метода rules() нашей модели:

<?php
class Posts extends CActiveRecord { //... public function rules() { return array( //... array('id, ..., fromDate, toDate', 'safe', 'on' => 'search'), ); } //... }

В метод search() модели добавим условие для поиска (у нас дата хранится в формате unix time, а выводится в формате d.m.Y, для конвертирования используем функцию strtotime()):

<?php
class Posts extends CActiveRecord { //... public function search() { //... if(!empty($this->fromDate) && empty($this->toDate)) { $criteria->condition = "date >= '" . strtotime($this->fromDate) . "'"; } elseif(!empty($this->toDate) && empty($this->fromDate)) { $criteria->condition = "date <= '" . strtotime($this->toDate). "'"; } elseif(!empty($this->toDate) && !empty($this->fromDate)) { $criteria->condition = "date >= '" . strtotime($this->fromDate) . "' and date <= '" . strtotime($this->toDate) . "'"; } //... } //... }

Контроллер (Controller)

В действие actionList() нашего контроллера получаем параметры переданные виджетом CGridView:

<?php
class PostsController extends Controller { //... public function actionList() { $model = new Posts('search'); //...
$request = Yii::app()->request->getParam('Posts'); $model->unsetAttributes(); if (isset($request)) { $model->attributes = $request; } $this->render('list', array( 'model' => $model, )); } //... }

Представление (View)

В представлении подключаем виджет CGridView, а в нем подключаем виджет CJuiDatePicker 2 раза в заголовке колонки "date", и добавляем код перезагрузки виджета в конец представления (view), что бы после ajax загрузки данных наш календарь не поломался:

<?php
//...
$this->widget('zii.widgets.grid.CGridView', array( 'dataProvider' => $model->search(), 'filter' => $model, 'id' => 'posts-grid', 'afterAjaxUpdate' => 'reinstallDatePicker', //... 'columns' => array( //... array( 'name' => 'date', 'type' => 'raw', 'filter' => $this->widget('zii.widgets.jui.CJuiDatePicker', array( 'model' => $model, 'attribute' => 'fromDate', 'language' => 'ru', 'options' => array( 'showAnim' => 'fold', 'dateFormat' => 'dd.mm.yy', 'changeMonth' => 'true', 'changeYear' => 'true', 'showButtonPanel' => 'true', ), ), true) . ' - ' . $this->widget('zii.widgets.jui.CJuiDatePicker', array( 'model' => $model, 'attribute' => 'toDate', 'language' => 'ru', 'options' => array( 'showAnim' => 'fold', 'dateFormat' => 'dd.mm.yy', 'changeMonth' => 'true', 'changeYear' => 'true', 'showButtonPanel' => 'true', ), ), true), 'filterHtmlOptions' => array('class' => 'user-filter-date'), 'value' => 'Yii::app()->dateFormatter->format("dd.M.yyyy", $data->date)', ), //... ), ));
Yii::app()->clientScript->registerScript('re-install-date-picker', " function reinstallDatePicker(id, data) { $('#Posts_fromDate, #Posts_toDate').datepicker(jQuery.extend({showMonthAfterYear:false},jQuery.datepicker.regional['ru'],{ 'showAnim' : 'fold', 'dateFormat' : 'dd.mm.yy', 'changeMonth' : 'true', 'changeYear' : 'true', 'showButtonPanel' : 'true'})); } ");

Готово, теперь мы можем выводить данные из таблицы по заданному диапазону дат.